home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / misc / FetchRefs1.3.lha / FetchRefs1.3 / Source.lha / Source / GenerateIndex / Main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-29  |  6.9 KB  |  315 lines

  1. #include "GenerateIndex.h"
  2.  
  3. extern struct WBStartup *_WBMsg;
  4. extern void _waitwbmsg(void);
  5.  
  6. const UBYTE VersTag[] = "$VER: GenerateIndex " VERSION " (" DATE ")";
  7.  
  8. const UBYTE Template[] =  "FROM/M,TO,SETTINGS,"
  9.             "RECURSIVELY/S,KEEPEMPTY/S,UNRECOGAREDOCS/S,"
  10.             "AUTODOC/S,"
  11.             "C/S,C_DEFINE/S,C_STRUCT/S,C_TYPEDEF/S,"
  12.             "E/S,E_CONST/S,E_OBJECT/S,E_PROC/S,"
  13.             "ASM/S,ASM_EQU/S,ASM_STRUCTURE/S,ASM_MACRO/S";
  14.  
  15. const UBYTE CLI_Help[] = "\n"
  16.            "GenerateIndex [[FROM] {wildcard}] [TO <file>] [SETTINGS <file>]\n"
  17.            "\t[RECURSIVELY] [KEEPEMPTY] [UNRECOGAREDOCS]\n"
  18.            "\t[AUTODOC]\n"
  19.            "\t[C] [C_DEFINE] [C_STRUCT] [C_TYPEDEF]\n"
  20.            "\t[E] [E_CONST] [E_OBJECT] [E_PROC]\n"
  21.            "\t[ASM] [ASM_EQU] [ASM_STRUCTURE] [ASM_MACRO]\n"
  22.            "\n"
  23.            "- Not specifying FROM will open the GUI (ReqTools and Triton required)\n"
  24.            "- A script is handy for Shell usage\n"
  25.            "- Study the guide for more information\n"
  26.            "\n";
  27.  
  28. /* Structure for ReadArgs() to return parsed arguments into */
  29. struct {
  30.     STRPTR (*From)[];
  31.     STRPTR To;
  32.     STRPTR Settings;
  33.     LONG Recursively, KeepEmpty, UnrecogAreDocs;
  34.     LONG AutoDoc;
  35.     LONG C_Active, C_Define, C_Struct, C_Typedef;
  36.     LONG E_Active, E_Const, E_Object, E_Proc;
  37.     LONG Asm_Active, Asm_Equ, Asm_Structure, Asm_Macro;
  38. } StartupArgs;
  39.  
  40. struct List FileList, EmptyList;
  41. struct RDArgs *Args;
  42. struct ReqToolsBase *ReqToolsBase;
  43.  
  44. /// _main() -- handle parsing of WB/Shell arguments
  45. __stkargs LONG
  46. _main(LONG argc, STRPTR argv)
  47. {
  48.     ReqToolsBase = OpenLibrary("reqtools.library", 38);
  49.     
  50.     /* This will initialize the list and create a pool */
  51.     InitializeFileList();
  52.     NewList(&EmptyList);
  53.  
  54.     if (_WBMsg)
  55.     {
  56.     struct DiskObject *diskobj;
  57.  
  58.     CurrentDir(_WBMsg->sm_ArgList->wa_Lock);
  59.     if (diskobj = GetDiskObject(_WBMsg->sm_ArgList->wa_Name))
  60.     {
  61.         STRPTR arg;
  62.  
  63.         if (arg = FindToolType(diskobj->do_ToolTypes, "TO"))
  64.         strncpy(DataName, arg, 255);
  65.  
  66.         /* Load specified or default settings file */
  67.         arg = FindToolType(diskobj->do_ToolTypes, "SETTINGS");
  68.         LoadSettings(arg ? arg : (STRPTR)"ENV:FetchRefs_GI.prefs");
  69.  
  70.         /* Release icon again */
  71.         FreeDiskObject(diskobj);
  72.  
  73.         /* Open GUI */
  74.         GoGUI();
  75.     } else
  76.         CloseAll(IoErr());
  77.     } else
  78.     {
  79.     if (Args = AllocDosObject(DOS_RDARGS, NULL))
  80.     {
  81.         /* Activate extended help */
  82.         Args->RDA_ExtHelp = CLI_Help;
  83.  
  84.         /* Parse arguments */
  85.         StartupArgs.From = (APTR)1;
  86.         if (ReadArgs(Template, (LONG *)&StartupArgs, Args))
  87.         {
  88.         /* Minor hack to help PostMessage() */
  89.         if (StartupArgs.From == (APTR)1)
  90.             StartupArgs.From = NULL;
  91.  
  92.         /* Do not bother to start if the user pressed CTRL-C during
  93.          * load time or during a 'GenerateIndex ?' help session.
  94.          */
  95.         if (CheckSignal(SIGBREAKF_CTRL_C))
  96.             CloseAll(0);
  97.  
  98.         /* Set options */
  99.         if (StartupArgs.Settings)
  100.             LoadSettings(StartupArgs.Settings);
  101.         else
  102.         {
  103.             if (StartupArgs.AutoDoc)
  104.             Settings.AutoDocPrf.Active = TRUE;
  105.  
  106.             if (StartupArgs.C_Active)
  107.             Settings.CPrf.Active = TRUE;
  108.             if (StartupArgs.C_Define)
  109.             Settings.CPrf.Define = TRUE;
  110.             if (StartupArgs.C_Struct)
  111.             Settings.CPrf.Struct = TRUE;
  112.             if (StartupArgs.C_Typedef)
  113.             Settings.CPrf.Typedef = TRUE;
  114.  
  115.             if (StartupArgs.E_Active)
  116.             Settings.EPrf.Active = TRUE;
  117.             if (StartupArgs.E_Const)
  118.             Settings.EPrf.Const = TRUE;
  119.             if (StartupArgs.E_Object)
  120.             Settings.EPrf.Object = TRUE;
  121.             if (StartupArgs.E_Proc)
  122.             Settings.EPrf.Proc = TRUE;
  123.  
  124.             if (StartupArgs.Asm_Active)
  125.             Settings.AsmPrf.Active = TRUE;
  126.             if (StartupArgs.Asm_Equ)
  127.             Settings.AsmPrf.Equ = TRUE;
  128.             if (StartupArgs.Asm_Structure)
  129.             Settings.AsmPrf.Structure = TRUE;
  130.             if (StartupArgs.Asm_Macro)
  131.             Settings.AsmPrf.Macro = TRUE;
  132.  
  133.             if (StartupArgs.Recursively)
  134.             Settings.Recursively = TRUE;
  135.             if (StartupArgs.KeepEmpty)
  136.             Settings.KeepEmpty = TRUE;
  137.             if (StartupArgs.UnrecogAreDocs)
  138.             Settings.UnknownAsAutoDoc = TRUE;
  139.         }
  140.  
  141.         if (StartupArgs.To)
  142.         {
  143.             if  (!StartupArgs.From)
  144.             strncpy(DataName, StartupArgs.To, 255);
  145.             else
  146.             LoadData(StartupArgs.To);
  147.         }
  148.  
  149.         if  (!StartupArgs.From)
  150.             GoGUI();
  151.         else if (StartupArgs.To)
  152.         {
  153.             /* Expand each wildcard (which can also be just a file)
  154.              * and generate index
  155.              */
  156.             ULONG count;
  157.             STRPTR path;
  158.             struct AnchorPath *fanchor;
  159.  
  160.             if (fanchor = AllocVec(sizeof(struct AnchorPath) + 256, MEMF_CLEAR))
  161.             {
  162.             fanchor->ap_Strlen = 256;
  163.             for (count = 0; path = (*StartupArgs.From)[count]; count++)
  164.             {
  165.                 if (!MatchFirst(path, fanchor))
  166.                 {
  167.                 do
  168.                 {
  169.                     STRPTR name;
  170.                     
  171.                     if (name = FullName(fanchor->ap_Buf))
  172.                     {
  173.                     StartScanning();
  174.                     if (fanchor->ap_Info.fib_DirEntryType < 0)
  175.                         IndexFile(name, "");
  176.                     else
  177.                         IndexRecursive(fanchor->ap_Buf, "");
  178.                     StopScanning(TRUE);
  179.                     FreeVec(name);
  180.                     } else
  181.                     CloseAll(IoErr());
  182.                 } while (!MatchNext(fanchor));
  183.                 MatchEnd(fanchor);
  184.                 }
  185.             }
  186.             FreeVec(fanchor);
  187.  
  188.             /* Sort the scanned list and save it */
  189.             SortExecList(&FileList, SortCompareFunc, NULL);
  190.             SaveData(StartupArgs.To);
  191.             } else
  192.             CloseAll(ERROR_NO_FREE_STORE);
  193.          } else
  194.             CloseAll(ERROR_REQUIRED_ARG_MISSING);
  195.         } else
  196.         CloseAll(IoErr());
  197.     } else
  198.         CloseAll(ERROR_NO_FREE_STORE);
  199.     }
  200.  
  201.     CloseAll(0);
  202. }
  203. ///
  204. /// CloseAll(LONG error [, STRPTR errtxt])
  205. void
  206. CloseAll(LONG error, ...)
  207. {
  208.     STRPTR errtxt;
  209.     va_list args;
  210.  
  211.     va_start(args, error);
  212.     errtxt = *(STRPTR *)args;
  213.     va_end(args);
  214.  
  215.     FreeFileList();
  216.  
  217.     if (error)
  218.     {
  219.     if (error == ERROR_CUSTOM)
  220.         PostMessage(errtxt);
  221.     else
  222.     {
  223.         UBYTE errortxt[80];
  224.  
  225.         Fault(error, "GenerateIndex", errortxt, 80);
  226.         PostMessage(errortxt);
  227.     }
  228.     }
  229.  
  230.     if (Args)
  231.     {
  232.     FreeArgs(Args);
  233.     FreeDosObject(DOS_RDARGS, Args);
  234.     }
  235.  
  236.     CloseLibrary(&ReqToolsBase->LibNode);
  237.  
  238.     _exit(error ? 5 : 0);
  239.  
  240.     /* Dummy reference; never actually called */
  241.     _waitwbmsg();
  242. }
  243. ///
  244.  
  245. /// LoadSettings()
  246. void
  247. LoadSettings(STRPTR file)
  248. {
  249.     BPTR fil;
  250.  
  251.     if (fil = Open(file, MODE_OLDFILE))
  252.     {
  253.     Read(fil, &Settings, sizeof(Settings));
  254.     Close(fil);
  255.     }
  256. }
  257. ///
  258. /// SaveSettings()
  259. void
  260. SaveSettings(STRPTR file)
  261. {
  262.     BPTR fil;
  263.  
  264.     if (fil = Open(file, MODE_NEWFILE))
  265.     {
  266.     Write(fil, &Settings, sizeof(Settings));
  267.     Close(fil);
  268.     }
  269. }
  270. ///
  271.  
  272. /// PostMessage() - does its best to get a message through to the user
  273. void
  274. PostMessage(STRPTR fmt, ...)
  275. {
  276.     static struct EasyStruct msgreq = {
  277.     sizeof(struct EasyStruct),
  278.     0,
  279.     "GenerateIndex " VERSION " by Anders Melchiorsen",
  280.     NULL,
  281.     "Okay"
  282.     };
  283.  
  284.     va_list args;
  285.  
  286.     msgreq.es_TextFormat = fmt;
  287.     va_start(args, fmt);
  288.  
  289.     /* Use a requester if the GUI is active */
  290.     if ((_WBMsg) || (!StartupArgs.From))
  291.     {
  292.     if (ReqToolsBase)
  293.         rtEZRequestA(fmt, "Okay", NULL, args, NULL);
  294.     else
  295.         EasyRequestArgs(NULL, &msgreq, NULL, args);
  296.     }
  297.     else
  298.     {
  299.     /* Print in Shell window */
  300.     VPrintf(fmt, args);
  301.     PutStr("\n");
  302.     }
  303.  
  304.     va_end(args);
  305. }
  306. ///
  307.  
  308. /// chkabort() -- disable DICE ^C check
  309. void
  310. chkabort(void)
  311. {
  312.     return;
  313. }
  314. ///
  315.